package com.cn.utils;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.*;

import javax.imageio.ImageIO;

import com.swetake.util.Qrcode;

public class QRcodeImage{
	
	//用来获取二维码图片
	public static void getQRcodeImage(String content, String path){
		//创建二维码类的对象
		Qrcode code = new Qrcode();
		//设置二维码的纠错能力，分为四个等级，分别是'L','M','Q','H'
		//纠错能力和纠错信息都存储在了二维码里面，纠错能力越强占用的空间的就越强，存储的有用的信息就越多
		code.setQrcodeErrorCorrect('M');//M
		//设置编码方式
		code.setQrcodeEncodeMode('B');//按照二进制进行编码
		//设置二维码的版本号,就是5*5的或者是21*21，现在已经到了40*40了
		code.setQrcodeVersion(7);
		//设置内容的编码方式
		byte[] bt =null;
		try {
			//美国的都是用ISO-88598-1编码的，所以先要使用ISO解码，然后在转化为U8就可以了，最后换成字节即可
			bt = new String(content.getBytes("UTF-8"),"UTF-8").getBytes();	
		} catch (UnsupportedEncodingException e){
			e.printStackTrace();
		}
		
		//还得创建一个存放二维码图片的缓冲区,其实就是一张纸有了，然后在纸上画二维码皆可以
		//要创建一支2D的画笔画出二维码就可以了
		BufferedImage bufIm = new BufferedImage(140,140,BufferedImage.TYPE_INT_BGR);
		//创建画笔绘制出二维码(注意要是一个2d的画笔才可以绘制出二维码)
		Graphics2D g = bufIm.createGraphics();
		
		//将矩形的背景颜色设置成白色
		g.setBackground(Color.WHITE);
		
		//绘制矩形
		g.clearRect(0, 0,140,140);		
		//将前景颜色设置成黑色
		g.setFont(new Font("微软雅黑", Font.BOLD, 13));
		g.setColor(Color.BLACK);
		
		//定义用来填充用的矩形的宽和高
		int innerRecX = 3;
		int innerRecY = 3;
		//定义内部矩形的距离
		int innerRecXStrut = 3;
		int innerRecYStrut = 3;

		//循环出二维数组
		if(bt.length > 0){
			//现在讲内容转成二维码的存储信息,这就要涉及到了二维码对象的一个重要的算法了calQrcode(Byte[]);
			boolean[][] arr= code.calQrcode(bt); //次方法返回的是一个boolean的二维数组
			for(int i=0;i<arr.length;i++){
				for(int j=0; j<arr.length;j++){
					if(arr[j][i]){
						//在二维码上填充哪些小小的黑色的矩形
						g.fillRect(j*innerRecX+innerRecXStrut, i*innerRecY+innerRecYStrut, 3, 3); //加2是为了能够有空格进行区分，使得数据信息不会那么容易出错
						//做到此处这个二维码就已经生成了，接下来要做的就是将其保存在文件中就可以了
					}
				}
			}
		}
		
		//释放画笔资源
		g.dispose();
		//刷新图片
		bufIm.flush();
		//创建保存路径
		try {
			File f = new File(path);
			ImageIO.write(bufIm, "jpg", f);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}
